//给你一个字符串 s ，逐个翻转字符串中的所有 单词 。 
//
// 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 
//
// 请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。 
//
// 说明： 
//
// 
// 输入字符串 s 可以在前面、后面或者单词间包含多余的空格。 
// 翻转后单词间应当仅用一个空格分隔。 
// 翻转后的字符串中不应包含额外的空格。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "the sky is blue"
//输出："blue is sky the"
// 
//
// 示例 2： 
//
// 
//输入：s = "  hello world  "
//输出："world hello"
//解释：输入字符串可以在前面或者后面包含多余的空格，但是翻转后的字符不能包括。
// 
//
// 示例 3： 
//
// 
//输入：s = "a good   example"
//输出："example good a"
//解释：如果两个单词间有多余的空格，将翻转后单词间的空格减少到只含一个。
// 
//
// 示例 4： 
//
// 
//输入：s = "  Bob    Loves  Alice   "
//输出："Alice Loves Bob"
// 
//
// 示例 5： 
//
// 
//输入：s = "Alice does not even like bob"
//输出："bob like even not does Alice"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 104 
// s 包含英文大小写字母、数字和空格 ' ' 
// s 中 至少存在一个 单词 
// 
//
// 
// 
//
// 
//
// 进阶： 
//
// 
// 请尝试使用 O(1) 额外空间复杂度的原地解法。 
// 
// Related Topics 双指针 字符串 
// 👍 419 👎 0

package com.cute.leetcode.editor.cn;

public class ReverseWordsInAString {
    public static void main(String[] args) {
        new ReverseWordsInAString().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)

    /**
     * 使用双指针节省空间
     * 从右向左遍历，right代表单词末尾
     * left是去除空格后的第一个字符的下标
     * index是为了扫描单词以及去除单词中间空格用的
     *
     * 使用C++的话可以进行原位转换，甚至不需要StringBuilder
     * 1.手动去除两边空格
     * 2.反转整个字符串
     * 3.反转每个单词
     *
     */
    class Solution {
        public String reverseWords(String s) {
            StringBuilder sb = new StringBuilder();
            int left = 0;
            int right = s.length()-1;
            //先去除两边的空格
            while (s.charAt(left)==' ') left++;
            while (s.charAt(right)==' ') right--;

            while (left <= right){
                int index = right;//先指向末尾
                while (index >= left && s.charAt(index)!=' ') index--;//找到第一个非字符位置
                for (int i = index+1; i <= right ; i++) sb.append(s.charAt(i));//添加字符拼接成单词
                if (index > left) sb.append(" ");//添加空格
                while (index >= left && s.charAt(index)==' ') index--;//寻找下一个单词末尾
                right = index;
            }
            return sb.toString();
        }

    }
//leetcode submit region end(Prohibit modification and deletion)

}